home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Archives / ARexxTools / ScionToMosaicV02.lha / Scion3.06ToMosaic.rexx next >
Encoding:
OS/2 REXX Batch file  |  1994-06-26  |  28.0 KB  |  825 lines

  1. /* © Harold H. Ipolyi        11 June 1994
  2.  
  3.         Requires ScionGenealogist V 3.06+
  4.  
  5. -------------------------------README----------------------------------------
  6. Short: ScionGenealogist > Mosaic.html
  7. Type: util/rexx
  8. Uploader: ipolyi@pat.mdc.com
  9. Author: Harold H. Ipolyi
  10. USmail: P.O.Box 891206, Houston, Tx 77289-1206
  11. Relsd: 11 June 1994 . ScionGenealogist V 3.06
  12. Rev01: 19 June 1994 . MakeDir(Gdir) fixed; extra comments processed.
  13. Rev02: 25 June 1994 . Fixed descenders; Women in List italicised.
  14.  
  15. Arexx script to convert ScionGenealogist data base to Mosaic hypertext format.
  16.  
  17.  
  18.  WHY?    some others in my family don't have Amigas.
  19.  
  20.     ScionGenealogist is easy to use, comprehensive, and
  21.     provides Arexx ports for extracting data.
  22.  
  23.     An ARexx script can repeatedly and painlessly recreate Mosaic
  24.     .html files from entries in the ScionGenealogist data base.
  25.  
  26.     Mosaic is an available common method of presentation.
  27.  
  28.  
  29.  TESTED:    on Amiga3000 Kickstart v.37.175 Workbench v.38.35
  30.         w/ ScionGenealogist V 3.06 & Mosaic1.2beta_NoNet
  31.         w/ ScionGenealogist V 3.06 & Mosaic1.2_NoNet
  32.  
  33.         Mosaic .html file compatibility tested on Sun NCSA Mosaic
  34.  
  35.  
  36.     100 ScionGenealogist entries create approx 75Kb of .html files.
  37. -------------------------------README----------------------------------------
  38.  
  39.   -----------------------------------------------------------------
  40.  | This Script is somewhat dependent on the following conventions  |
  41.  | that I followed in my data base:                                |
  42.  |                                                                 |
  43.  | ·  lastnames are kept pure (no honorifics, Jr's, III's )        |
  44.  |                                                                 |
  45.  | ·  given names have any and all honorifics AFTER a COMMA        |
  46.  |                                                                 |
  47.  |  for example:  LastName      FirstNames, honorifics             |
  48.  |                                                                 |
  49.  |                BAUER-GAUSS   Joseph, Dr.                        |
  50.  |                DAGLEY        Richard Kelley, Jr.                |
  51.  |                                                                 |
  52.  |-----------------------------------------------------------------|
  53.  |                                                                 |
  54.  |  For a name change (not maidenname > marriedname), try this:    |
  55.  |                New           Birth Name > Changed To, Ph. D.    |
  56.  |     which lists as: Birth Name > Changed To New, Ph. D.         |
  57.  |                                                                 |
  58.  |-----------------------------------------------------------------|
  59.  |                                                                 |
  60.  | ·  all dates are in the author's suggested form:  8 Jul 1939    |
  61.  |                                                                 |
  62.  |      ( not only is 7/8/39 ambigous, it will also break )        |
  63.  |      ( my .html file naming convention in a big way    )        |
  64.  |                                                                 |
  65.  | (   To any who may ask: it would be easy code around,         ) |
  66.  | (   but the form suggested by ScionGenealogist author         ) |
  67.  | (   Robbie J Akins makes much more sense to me!               ) |
  68.  |                                                                 |
  69.  | · if Death Date is blank; Death Place can be a COMMENT field    |
  70.  |                                            e.g. Phone #         |
  71.  | · if Burial Date is blank; Burial Place can be a COMMENT field  |
  72.  |                                            e.g. Address         |
  73.   -----------------------------------------------------------------
  74.  
  75.  * Running 'rx Scion3.06ToMosaic.rexx' gives further directions
  76.  
  77.  * Briefly, · start ScionGenealogist and load a data base
  78.  *          · 'assign Genealogy: '{Scion data base directory}
  79.  *          · start a Shell, cd to wherever you have or wish to have
  80.  *               the directory of Mosaic .html's
  81.  *          · 'rx Scion3.06ToMosaic.rexx Normal' to automagically create a 
  82.  *              Mosaic .html file for each person in your 
  83.  *              ScionGenealogist data base; following the TEMPLATE:
  84.  
  85. ####################################################################
  86. <TITLE>PERSON Data Sheet</TITLE>
  87. <H2>PERSON (PERSONGENDER) <A HREF="PERSONI.html"><i>more info</i></A> (()) 
  88. <A href="Genealogy/GenealogyFile.html"><B>List of persons.</B></A></H2>
  89. <H3>
  90. Born: BIRTHDATe ^ BIRTHPLACE <P>
  91. <P>
  92. Died: DEATHDATE + DEATHPLACE . Buried: BURIALPLACE <P>
  93. <P>
  94. </H3>
  95. <HR>            /* NEW FORMAT BELOW */
  96. <PRE>
  97. <TT>
  98.   <A HREF="FATHER.html">FATHER</A>_//\_<A HREF="MOTHER.html">MOTHER</A> & MARRIAGEDATE @ MARRIAGEPLACE
  99.   |_____ <A HREF="SIBLING1.html">SIBLING1</A> (SIBLING1GENDER) ^ SIBLING1BIRTHDAT
  100.   |_____ <A HREF="SIBLING2.html">SIBLING2</A> (SIBLING2GENDER) ^ SIBLING2BIRTHDAT
  101.   |_____ <A HREF="SIBLING3.html">SIBLING3</A> (SIBLING3GENDER) ^ SIBLING3BIRTHDAT
  102.   |             
  103.   <B>PERSON</B>_//\_<A HREF="SPOUSE1.html">SPOUSE1</A> & MARRIAGE1DATE @ MARRIAGE1PLACE
  104.   |  |  |_____ <A HREF="mFGRN1c1.html">mFGRN1c1</A> (mFGRN1c1GENDER) ^ mFGRN1c1BIRTHDATE
  105.   |  |  |_____ <A HREF="mFGRN1c2.html">mFGRN1c2</A> (mFGRN1c2GENDER) ^ mFGRN1c2BIRTHDATE
  106.   |  |  |_____ <A HREF="mFGRN1c3.html">mFGRN1c3</A> (mFGRN1c3GENDER) ^ mFGRN1c3BIRTHDATE
  107.   |  |
  108.   |  |_//\_<A HREF="SPOUSE2.html">SPOUSE2</A> & MARRIAGE2DATE @ MARRIAGE2PLACE
  109.   |    |_____ <A HREF="mFGRN2c1.html">mFGRN2c1</A> (mFGRN2c1GENDER) ^ mFGRN2c1BIRTHDATE
  110.   |    |_____ <A HREF="mFGRN2c2.html">mFGRN2c2</A> (mFGRN2c2GENDER) ^ mFGRN2c2BIRTHDATE
  111.   |    |_____ <A HREF="mFGRN2c3.html">mFGRN2c3</A> (mFGRN2c3GENDER) ^ mFGRN2c3BIRTHDATE
  112.   |
  113.   |_//\_<A HREF="SPOUSE3.html">SPOUSE3</A> & MARRIAGE3DATE @ MARRIAGE3PLACE
  114.     |_____ <A HREF="mFGRN3c1.html">mFGRN3c1</A> (mFGRN3c1GENDER) ^ mFGRN3c1BIRTHDATE
  115.     |_____ <A HREF="mFGRN3c2.html">mFGRN3c2</A> (mFGRN3c2GENDER) ^ mFGRN3c2BIRTHDATE
  116.     |_____ <A HREF="mFGRN3c3.html">mFGRN3c3</A> (mFGRN3c3GENDER) ^ mFGRN3c3BIRTHDATE
  117. ####################################################################
  118.  
  119.  * In a Mosaic file (maybe HOME PAGE) have an anchor pointing to GenealogyFile:
  120.  
  121. <A href="file://localhost/Doc:Mosaic/DBNAMEGenealogy/GenealogyFile.html">
  122. Genealogy</A>
  123.  
  124. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  125. ^^ assumes you ran 'rx Scion3.06ToMosaic.rexx Normal' in directory: Doc:Mosaic ^^
  126. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  127.  
  128.  *       You might also create an {MyGenealogy}.html file yourself in directory
  129.  *       Doc:Mosaic/DBNAMEGenealogy as a starting point, with the anchor of
  130.  
  131. <A href="file://localhost/Doc:Mosaic/DBNAMEGenealogy/MyGenealogyFile.html">
  132. My Genealogy</A>
  133.  
  134.  e.g.:
  135. _____________________________________________________________
  136.  
  137. <TITLE>FirstName LastName Genealogy </TITLE>
  138. <H1>FirstName LastName Genealogy</H1>
  139. <HR>
  140. <A HREF="GenealogyFile.html">List of Persons.</A><P>
  141.  
  142. This is the genealogy of
  143. <A href="FiLast8Jul1939.html">FirstName LastName</A>.
  144. _____________________________________________________________
  145.          ^^^^^^^^^^^^^^
  146.  * Note the convention of first 2 characters from FirstName
  147.  *                        first 4 characters from LastName
  148.  *                        & BirthDate (with all blanks removed)
  149.  *
  150.  * If the BirthDate is not entered, the convention is:
  151.  *                        first 2 characters from FirstName
  152.  *                        first 6 characters from LastName
  153.  *                        & ScionGenealogist IRN
  154.  *
  155. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  156. »«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«
  157. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  158. »«»«                                                                      »«»«
  159. «»«» GetLastName: this PROCEDURE at the very end of this script           «»«»
  160. »«»«                                 is used to Capitalize Last Names.    »«»«
  161. «»«»     -------------------------------------------------------------    «»«»
  162. »«»«     | it can also be used to handle "non-conforming" Last Names |    »«»«
  163. «»«»     |                e.g. "MAC ISAAC" --> "MacISAAC"            |    «»«»
  164. »«»«     |                     "VON NUEMANN" --> "VonNuemann"        |    »«»«
  165. «»«»     -------------------------------------------------------------    «»«»
  166. »«»«     BUT: you must add the additional tests yourself (it's easy!)     »«»«
  167. «»«»                                                                      «»«»
  168. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  169. »«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«
  170. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  171.  
  172.  * The PN{IRN}.DBNAME files are used to generate the "more info" files.
  173.  
  174.  * Whenever the PN{IRN}.DBNAME is changed or replaced, the corresponding
  175.  * "more info" file will be updated if 'rx Scion3.06ToMosaic.rexx {IRN}' is re-run.
  176.  
  177.  * TO DO: picture file anchors? PP{IRN}.DBNAME? ILBM not portable. Convert?
  178.  
  179. */
  180.  
  181. IF ~Show(p,'SCIONGEN') THEN DO
  182.     SAY ' '
  183.     SAY '    ScionGenealogist is NOT currently running:'
  184.     SAY ' '
  185.     SAY '        1. Please start ScionGenealogist and'
  186.     SAY ' '
  187.     SAY '        2. load the desired data base. Then:'
  188.     SAY ' '
  189.     SAY '        3. rx Scion3.06ToMosaic.rexx Normal'
  190.     SAY ' '
  191.     EXIT
  192.     END
  193.  
  194. PARSE ARG target
  195. IF target = "" THEN
  196.     DO
  197.     SAY ' '
  198.     SAY '        please send comments, questions to:'
  199.     SAY ' '
  200.     SAY '            ipolyi@pat.mdc.com'
  201.     SAY '                or:'
  202.     SAY '            Harold H. Ipolyi '
  203.     SAY '             P.O.Box 891206 '
  204.     SAY '             Houston, Tx 77289-1206 '
  205.     SAY ' '
  206.     SAY ' Convert ScionGenealogist information to Mosaic hypertext '
  207.     SAY ' '
  208.     SAY 'Usage: rx Scion3.06ToMosaic.rexx Normal {recreates all PERSON.html files}'
  209.     SAY '       rx Scion3.06ToMosaic.rexx IRN    {recreates a PERSON.html file}'
  210.     SAY ' '
  211.     EXIT
  212.     END
  213. ELSE    target = Upper(target)
  214.  
  215. /* add libraries */
  216.         libs = 'rexxsupport.library rexxarplib.library'
  217.         DO i = 1 TO Words(libs)
  218.                 lib = Word(libs,i)
  219.                 IF ~Show('Lib',lib) THEN DO
  220.                         IF EXISTS('LIBS:'lib) then call addlib lib, 0, -30
  221.                         ELSE DO
  222.                                 'message "===> cannot find' lib 'in LIBS:"'
  223.                                 EXIT 10
  224.                         END
  225.                 END
  226.         END i
  227.  
  228. Address "SCIONGEN"    /* Point at Scion Genealogist port */
  229. options RESULTS
  230. 'GETDBNAME'        /* Issue command to Scion Genealogist */
  231. DBNAME = RESULT
  232.             /* ??? GETDBDIRPATH ??? of Scion data base */
  233.  
  234. SAY ' '
  235. Say ' Testing: is data base assignment of Genealogy:'DBNAME' visible?'
  236. SAY ' '
  237.  
  238. PRAGMA('w','n')
  239. IF ~Exists("Genealogy:"DBNAME) THEN DO
  240.     SAY '     Genealogy:'DBNAME' not found,'
  241.     SAY ' '
  242.     SAY "     Please create an assign to data base "DBNAME"'s directory:"
  243.     SAY ' '
  244.     SAY ' assign Genealogy: {Volume:Directory}'
  245.     SAY ' '
  246.     EXIT
  247.     END
  248. PRAGMA('w','w')
  249.  
  250. Gdir = DBNAME'Genealogy'
  251.  
  252. IF ~Makedir(Gdir) THEN DO
  253.     SAY ' '
  254.     SAY ' ===> unable to create directory: 'Gdir
  255.     SAY ' '
  256.     EXIT
  257.     END
  258.  
  259.  
  260. 'GETTOTALIRN'        /* Issue command to Scion Genealogist */
  261.     TOTALIRN = RESULT
  262.  
  263. Say "Number of people in database " DBNAME " = " TOTALIRN
  264. IF IsNumeric(target) THEN
  265.     DO
  266.     Say "Processing person " target " of " TOTALIRN " in database " DBNAME
  267.     IF target <= TOTALIRN THEN    CALL MakeOne(target)
  268.     END
  269. ELSE
  270.     DO
  271.     IF target = "TEST" THEN DO
  272.         DO i = 1 TO 7
  273.         CALL MakeOne(i)
  274.             END
  275.         END
  276.     ELSE
  277.         DO
  278.         Say "Processing all " TOTALIRN " persons in database " DBNAME
  279.  
  280. /* GenealogyFile.html is a Scion data base IRN order list of all persons in 
  281.    Mosaic .html format, format:
  282.  
  283.    person ^ birthdate + deathdate (()) father //\ mother    */
  284.  
  285. Say 'Mosaic file name: 'Gdir'/GenealogyFile.html for: List of Persons.'
  286.  
  287.         Open('GenealogyFile',Gdir'/GenealogyFile.html','w')
  288.         WriteLn('GenealogyFile','<HTML>')
  289.         WriteLn('GenealogyFile','<TITLE>List of Persons.</TITLE>')
  290. WriteLn('GenealogyFile','<H2>List of Persons in data base "'DBNAME'". <B>'Time()' - 'Date()'</B></H2>')
  291.         WriteLn('GenealogyFile','<H3>')
  292.  
  293.         DO i = 1 TO TOTALIRN
  294.             CALL MakeOne(i)
  295.             END
  296.         WriteLn('GenealogyFile','</H3>')
  297.         WriteLn('GenealogyFile','<HR>')
  298.         WriteLn('GenealogyFile','<Address>')
  299.         WriteCh('GenealogyFile','<H3>ScionGenealogist © Robbie J Akins; ')
  300.         WriteLn('GenealogyFile','Scion3.06ToMosaic.rexx © Harold Ipolyi</H3>')
  301.         WriteLn('GenealogyFile','</Address>')
  302.         WriteLn('GenealogyFile','</HTML>')
  303.         END
  304. Say ' '
  305. ThisPath = PRAGMA('d')
  306. IF Substr(ThisPath,Length(ThisPath),Length(ThisPath)) ~= ":" THEN ThisPath = ThisPath'/'
  307. Say ' ---------------------------------------------------------------------'
  308. Say ' If you have not already done so, add the following anchor pointing to'
  309. Say ' "'GetLastName(DBNAME)' Genealogy" to a Mosaic file (maybe HOME PAGE):'
  310. Say ' ---------------------------------------------------------------------'
  311. Say ' <A href="/'ThisPath||Gdir'/GenealogyFile.html">'GetLastName(DBNAME)' Genealogy</A>'
  312. Say ' ------------------------------------------------------------------'
  313. Say ' '
  314.     END
  315. Say 'Scion3.06ToMosaic.rexx completed normally'
  316. EXIT
  317.  
  318. /*************************************************************************/
  319.  
  320. MakeOne: PROCEDURE EXPOSE target DBNAME Gdir
  321.     PARSE ARG ScionIRN
  322. 'EXISTPERSON' ScionIRN
  323. /**/
  324. if RESULT = 'YES' THEN
  325.     DO
  326.     'GETLASTNAME' ScionIRN
  327.     LASTNAME = GetLastName(RESULT)
  328.     'GETFIRSTNAME' ScionIRN
  329.     FIRSTNAME = RESULT
  330.     thelastname = LASTNAME
  331.     FULLNAME = GetFullName(FIRSTNAME)
  332.     'GETSEX' ScionIRN
  333.     GENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  334.     'GETBIRTHDATE' ScionIRN
  335.     BIRTHDATE = RESULT
  336.     'GETBIRTHPLACE' ScionIRN
  337.     BIRTHPLACE = RESULT
  338.     'GETDEATHDATE' ScionIRN
  339.     DEATHDATE = RESULT
  340.     'GETDEATHPLACE' ScionIRN
  341.     DEATHPLACE = RESULT
  342.     'GETBURIALPLACE' ScionIRN
  343.     BURIALPLACE = RESULT
  344.     'GETPERSUSER1' ScionIRN
  345.     PERSUSER1 = RESULT
  346.     'GETPERSUSER2' ScionIRN
  347.     PERSUSER2 = RESULT
  348.     'GETPERSUSER3' ScionIRN
  349.     PERSUSER3 = RESULT
  350. /**/
  351.     IF LASTNAME = "" THEN
  352.         DO
  353. Say "Person " ScionIRN"'s last name is not defined; no new Mosaic file being created!"
  354.         RETURN
  355.         END
  356.     IF BIRTHDATE = "" THEN
  357.         PERSONFILENAME = Space(substr(FIRSTNAME,1,2) substr(LASTNAME,1,6) ScionIRN)
  358.     ELSE
  359.         PERSONFILENAME = Space(substr(FIRSTNAME,1,2) substr(LASTNAME,1,4) BIRTHDATE)
  360. /**/
  361.     PfilN = Gdir'/'PERSONFILENAME
  362.     Say 'Mosaic file name: 'PfilN'.html for: 'FULLNAME' {'ScionIRN'}'
  363.     Open('PERSONFILE',PfilN'.html','w')
  364.     WriteLn('PERSONFILE','<HTML>')
  365.     WriteLn('PERSONFILE','<TITLE>'FULLNAME' Data Sheet</TITLE>')
  366.     WriteCH('PERSONFILE','<H2>'FULLNAME' ('GENDER') ')
  367. /**/
  368.     IF Exists(PfilN'I.html') THEN DO
  369.         IF Exists('Genealogy:PN'ScionIRN'.'DBNAME) THEN DO
  370. Parse value StateF(PfilN'I.html') with type size blk bits PFday PFmin PFtick com
  371. Parse value StateF('Genealogy:PN'ScionIRN'.'DBNAME) with type size blk bits PNday PNmin PNtick com
  372. /* Say PERSONFILENAME'I.html' PFday PFmin PFtick  'Genealogy:PN'ScionIRN'.'DBNAME PNday PNmin PNtick */
  373.             IF ( PNday > PFday ) | ( PNday = PFday & PNmin > PFmin ) THEN DO
  374.                 Delete(PfilN'I.html')
  375. Say 'Scion file Genealogy:PN'ScionIRN'.'DBNAME 'newer than 'PfilN'I.html; replacing!'
  376.                 END
  377.             END
  378.         END
  379. /**/
  380.     IF Exists(PfilN'I.html') THEN
  381. WriteCH('PERSONFILE',' <A HREF="'PERSONFILENAME'I.html"><i>more info</i></A>')
  382.     ELSE DO
  383.         IF Exists('Genealogy:PN'ScionIRN'.'DBNAME) THEN DO
  384.             Say 'Writing info file 'PfilN'I.html'
  385.             Open('PNDBNAME','Genealogy:PN'ScionIRN'.'DBNAME,'r')
  386.             Open('PERSONI',PfilN'I.html','w')
  387.     WriteLn('PERSONI','<HTML>')
  388.     WriteLn('PERSONI','<TITLE>'FULLNAME' Information</TITLE>')
  389.     WriteLn('PERSONI','<H2>'FULLNAME' Information.</H2><PRE><TT>')
  390.             DO While ~EOF('PNDBNAME')
  391.                 line = ReadLn('PNDBNAME')
  392.                 WriteLn('PERSONI',line)
  393.             END
  394.             Close('PNDBNAME')
  395.             WriteLn('PERSONI','</HTML>')
  396.             Close('PERSONI')
  397. WriteCH('PERSONFILE',' <A HREF="'PERSONFILENAME'I.html"><i>more info</i></A>')
  398.             END
  399.         END
  400. /**/
  401. WriteLn('PERSONFILE',' <A HREF="GenealogyFile.html"><B>List of Persons.</B></A></H2><H3>')
  402.     IF BIRTHDATE || BIRTHPLACE ~= "" THEN DO
  403.         WriteCh('PERSONFILE','Born: ')
  404.         IF BIRTHDATE ~= "" THEN WriteCh('PERSONFILE',BIRTHDATE)
  405.         IF BIRTHPLACE ~= "" THEN WriteCh('PERSONFILE',' ^ 'BIRTHPLACE)
  406.         WriteLn('PERSONFILE','<BR>')
  407.         END
  408.     IF DEATHDATE ~= "" THEN
  409.         DO
  410.         WriteCH('PERSONFILE','Died: 'DEATHDATE' + 'DEATHPLACE)
  411.     IF BURIALPLACE ~= "" THEN WriteCH('PERSONFILE',' . Buried: 'BURIALPLACE)
  412.         WriteLn('PERSONFILE','<BR>')
  413.         END
  414.     ELSE
  415.         DO
  416.         IF DEATHPLACE ~= "" THEN WriteLn('PERSONFILE',DEATHPLACE'<BR>')
  417.         IF BURIALPLACE ~= "" THEN WriteLn('PERSONFILE',BURIALPLACE'<BR>')
  418.         END
  419.     IF PERSUSER1 ~= "" THEN WriteLn('PERSONFILE',PERSUSER1'<BR>')
  420.     IF PERSUSER2 ~= "" THEN WriteLn('PERSONFILE',PERSUSER2'<BR>')
  421.     IF PERSUSER3 ~= "" THEN WriteLn('PERSONFILE',PERSUSER3'<BR>')
  422.  
  423. /* end of personal data; start family tree segment */
  424.  
  425.     WriteLn('PERSONFILE','<HR>')
  426.     WriteLn('PERSONFILE','<PRE><TT>')
  427.     'GETPARENTS' ScionIRN
  428.     PARENTS = RESULT
  429.         tPARENTSt = 't'PARENTS't'
  430. /* Say 'PARENTS = 'PARENTS tPARENTSt    ??? EXISTPARENTS IRN ???    */
  431.     HasFileFATHER = 0
  432.     HasFileMOTHER = 0
  433.     HasMOTHER = 0
  434.     HasFATHER = 0
  435. /**/
  436.     IF tPARENTSt ~= 'tt' THEN
  437.         DO
  438.         PARENTS = RESULT
  439.         'GETPRINCIPAL' PARENTS
  440.         PRINCIPAL = RESULT
  441.         'GETSPOUSE' PARENTS
  442.         SPOUSE = RESULT
  443.         'GETMARRYDATE' PARENTS
  444.         PARENTSMARRIAGEDATE = RESULT
  445.         'GETMARRYPLACE' PARENTS
  446.         PARENTSmFGRNPLACE = RESULT
  447.         'GETFAMUSER1' PARENTS
  448.         PARENTSmFGRNCELEBRANT = RESULT
  449.         'GETFAMUSER2' PARENTS
  450.         PARENTSmFGRNCOMMENT = RESULT
  451.         'GETSEX' PRINCIPAL
  452.         IF RESULT = 'M' THEN
  453.             DO
  454.             FATHERScionIRN = PRINCIPAL
  455.             MOTHERScionIRN = SPOUSE
  456.             END
  457.         ELSE
  458.             DO
  459.             FATHERScionIRN = SPOUSE
  460.             MOTHERScionIRN = PRINCIPAL
  461.             END
  462.         'GETLASTNAME' FATHERScionIRN
  463.         FATHERLASTNAME = GetLastName(RESULT)
  464.         'GETFIRSTNAME' FATHERScionIRN
  465.         FATHERFIRSTNAME = RESULT
  466.         IF FATHERFIRSTNAME ~= "" THEN HasFATHER = 1
  467.         thelastname = FATHERLASTNAME
  468. FATHERFULLNAME = GetFullName(FATHERFIRSTNAME)
  469.         'GETBIRTHDATE' FATHERScionIRN
  470.         FATHERBIRTHDATE = RESULT
  471.         'GETLASTNAME' MOTHERScionIRN
  472.         MOTHERLASTNAME= GetLastName(RESULT)
  473.         'GETFIRSTNAME' MOTHERScionIRN
  474.         MOTHERFIRSTNAME = RESULT
  475.         IF MOTHERFIRSTNAME ~= "" THEN HasMOTHER = 1
  476.         thelastname = MOTHERLASTNAME
  477. MOTHERFULLNAME = GetFullName(MOTHERFIRSTNAME)
  478.         'GETBIRTHDATE' MOTHERScionIRN
  479.         MOTHERBIRTHDATE = RESULT
  480. /**/
  481.         IF FATHERLASTNAME ~= "" THEN
  482.             DO
  483.             HasFileFATHER = 1
  484.             IF FATHERBIRTHDATE = "" THEN
  485.                 DO
  486. FATHERFILENAME = Space(substr(FATHERFIRSTNAME,1,2) substr(FATHERLASTNAME,1,6) FATHERScionIRN)
  487.                 END
  488.             ELSE
  489.                 DO
  490. FATHERFILENAME = Space(substr(FATHERFIRSTNAME,1,2) substr(FATHERLASTNAME,1,4) FATHERBIRTHDATE)
  491.                 END        
  492.             END        
  493. /**/
  494.         IF MOTHERLASTNAME ~= "" THEN
  495.             DO
  496.             HasFileMOTHER = 1
  497.             IF MOTHERBIRTHDATE = "" THEN
  498.                 DO
  499. MOTHERFILENAME = Space(substr(MOTHERFIRSTNAME,1,2) substr(MOTHERLASTNAME,1,6) MOTHERScionIRN)
  500.                 END
  501.             ELSE
  502.                 DO
  503. MOTHERFILENAME = Space(substr(MOTHERFIRSTNAME,1,2) substr(MOTHERLASTNAME,1,4) MOTHERBIRTHDATE)
  504.                 END
  505.             END        
  506. /**/
  507.         WriteCH('PERSONFILE','  ')
  508.         IF HasFileFATHER THEN WriteCH('PERSONFILE','<A HREF="'FATHERFILENAME'.html">')
  509.         WriteCH('PERSONFILE',FATHERFULLNAME)
  510.         IF HasFileFATHER THEN WriteCH('PERSONFILE','</A> //\ ')
  511.         IF HasFileMOTHER THEN WriteCH('PERSONFILE','<A HREF="'MOTHERFILENAME'.html">')
  512.         WriteCH('PERSONFILE',MOTHERFULLNAME)
  513.         IF HasFileMOTHER THEN WriteCH('PERSONFILE','</A>')
  514. /**/
  515.         IF PARENTSMARRIAGEDATE ~= "" THEN
  516. WriteCH('PERSONFILE',' & 'PARENTSMARRIAGEDATE)
  517.         IF PARENTSmFGRNPLACE ~= "" THEN
  518. WriteCH('PERSONFILE',' @ 'PARENTSmFGRNPLACE)
  519. /**/
  520.         WriteLn('PERSONFILE','')
  521.         spcs = '  |'
  522.         DO i = 0 TO Length(FATHERFULLNAME)
  523.             spcs = spcs' '        /*    ??? GETFAMLBL1 ???    */
  524.         END                /*    ??? GETFAMLBL2 ???    */
  525. IF PARENTSmFGRNCELEBRANT ~= '' THEN WriteLn('PERSONFILE',spcs' Celebrant: 'PARENTSmFGRNCELEBRANT)
  526. IF PARENTSmFGRNCOMMENT ~= '' THEN WriteLn('PERSONFILE',spcs' 'PARENTSmFGRNCOMMENT' ')
  527.         DO i = 0 TO 39            /*    ??? GETTOTCHILDREN FGRN ???    */
  528.             'GETCHILD' PARENTS i
  529.             PARENTSc = RESULT
  530.             'GETFIRSTNAME' PARENTSc
  531.             PARENTScFIRSTNAME = RESULT
  532. /**/
  533.             IF PARENTScFIRSTNAME ~= "" THEN
  534.                 DO
  535.                 IF PARENTSc ~= ScionIRN THEN
  536.                     DO
  537.                     'GETLASTNAME' PARENTSc
  538.                     PARENTScLASTNAME = GetLastName(RESULT)
  539.                     'GETFIRSTNAME' PARENTSc
  540.                     PARENTScFIRSTNAME = RESULT
  541.                     thelastname = PARENTScLASTNAME
  542. PARENTScFULLNAME = GetFullName(PARENTScFIRSTNAME)
  543.                     'GETSEX' PARENTSc
  544. PARENTScGENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  545.                     'GETBIRTHDATE' PARENTSc
  546.                     PARENTScBIRTHDATE = RESULT
  547.                     'GETDEATHDATE' PARENTSc
  548.                     PARENTScDEATHDATE = RESULT
  549. /**/
  550.                     IF PARENTScBIRTHDATE = "" THEN
  551. PARENTScFILENAME = Space(substr(PARENTScFIRSTNAME,1,2) substr(PARENTScLASTNAME,1,6) PARENTSc)
  552.                     ELSE
  553. PARENTScFILENAME = Space(substr(PARENTScFIRSTNAME,1,2) substr(PARENTScLASTNAME,1,4) PARENTScBIRTHDATE)
  554. /**/
  555. WriteCH('PERSONFILE','  |_____ <A HREF="'PARENTScFILENAME'.html">')
  556. /**/
  557.                     IF PARENTScLASTNAME ~= FATHERLASTNAME THEN
  558. WriteCH('PERSONFILE',' 'PARENTScFULLNAME)
  559.                     ELSE
  560. WriteCH('PERSONFILE',PARENTScFIRSTNAME )
  561. /**/
  562. WriteCH('PERSONFILE','</A> ('PARENTScGENDER') 'PARENTScBIRTHDATE)
  563. /**/
  564.                     IF PARENTScDEATHDATE ~= "" THEN
  565. WriteCH('PERSONFILE','   + 'PARENTScDEATHDATE)
  566. /**/
  567. Writeln('PERSONFILE','')
  568.                     END
  569.                 END
  570.             END
  571.         END
  572.     END
  573.  
  574. /* end of parents, siblings segment; start marriages segment */
  575.  
  576.         vert.0 = ''
  577.         vert.1 = ' |'
  578.         DO i = 0 TO 39                  /*      ??? GETTOTMARRIAGES IRN ???     */
  579.                 'GETMARRIAGE' ScionIRN i
  580.                 MARRIAGE = RESULT               /* use: 'EXISTFAMILY'   */
  581.                 IF MARRIAGE > -1 THEN
  582.                         DO
  583.                         MARRIAGES = i
  584.                         j = i + 1
  585.                         vert.j = vert.i vert.1
  586.                         END
  587.         END
  588.         tMARRIAGESt = 't'MARRIAGES't'
  589. /*    Say 'MARRIAGES = 'MARRIAGES tMARRIAGESt    */
  590.  
  591.     IF tMARRIAGESt ~= 'tMARRIAGESt' THEN
  592.  
  593.         DO
  594.         WriteLn('PERSONFILE','  |')
  595.         DO i = 0 TO MARRIAGES
  596.             'GETMARRIAGE' ScionIRN i
  597.             mFGRN = RESULT
  598.             IF mFGRN ~= "" THEN
  599.                 DO
  600.                 ki = MARRIAGES - i + 1
  601.                 IF ki ~= MARRIAGES + 1 THEN WriteLn('PERSONFILE',vert.ki)
  602.                 j = MARRIAGES + 1 - i
  603.                 'GETSPOUSE' mFGRN
  604.                 SPOUSE = RESULT
  605.                 IF SPOUSE = ScionIRN THEN
  606.                     DO
  607.                     'GETPRINCIPAL' mFGRN
  608.                     SPOUSE = RESULT
  609.                     END
  610.                 'GETLASTNAME' SPOUSE
  611.                 SPOUSELASTNAME = GetLastName(RESULT)
  612.                 'GETFIRSTNAME' SPOUSE
  613.                 SPOUSEFIRSTNAME = RESULT
  614.                 thelastname = SPOUSELASTNAME
  615. SPOUSEFULLNAME = GetFullName(SPOUSEFIRSTNAME)
  616.                 'GETBIRTHDATE' SPOUSE
  617.                 SPOUSEBIRTHDATE = RESULT
  618.                 'GETMARRYDATE' mFGRN
  619.                 MARRIAGEDATE = RESULT
  620.                 'GETMARRYPLACE' mFGRN
  621.                 mFGRNPLACE = RESULT
  622.                 'GETFAMUSER1' mFGRN
  623.                 MARRIAGECELEBRANT = RESULT
  624.                 'GETFAMUSER2' mFGRN
  625.                 MARRIAGECOMMENT = RESULT
  626. /**/
  627.                 IF SPOUSEBIRTHDATE = "" THEN
  628. SPOUSEFILENAME = Space(substr(SPOUSEFIRSTNAME,1,2) substr(SPOUSELASTNAME,1,6) SPOUSE)
  629.                 ELSE
  630. SPOUSEFILENAME = Space(substr(SPOUSEFIRSTNAME,1,2) substr(SPOUSELASTNAME,1,4) SPOUSEBIRTHDATE)
  631. /**/
  632.                 IF i = 0 THEN
  633.                     DO
  634. WriteCH('PERSONFILE','  <B>'FULLNAME'</B> //\ ')
  635.  
  636.                     IF SPOUSELASTNAME ~= "" THEN
  637. WriteCH('PERSONFILE','<A HREF="'SPOUSEFILENAME'.html">')
  638.  
  639. WriteCH('PERSONFILE',SPOUSEFULLNAME)
  640.  
  641.                     IF SPOUSELASTNAME ~= "" THEN
  642. WriteCH('PERSONFILE','</A>')
  643.  
  644.                     END
  645.  
  646.                 ELSE DO
  647. WriteCH('PERSONFILE',vert.j'_ //\ ')
  648.  
  649.                     IF SPOUSELASTNAME ~= "" THEN
  650. WriteCH('PERSONFILE','<A HREF="'SPOUSEFILENAME'.html">')
  651.  
  652. WriteCH('PERSONFILE',SPOUSEFULLNAME)
  653.  
  654.                     IF SPOUSELASTNAME ~= "" THEN
  655. WriteCH('PERSONFILE','</A>')
  656.  
  657.                     END
  658.  
  659.                 IF MARRIAGEDATE ~= "" THEN
  660. WriteCH('PERSONFILE',' & 'MARRIAGEDATE)
  661.                 IF mFGRNPLACE ~= "" THEN
  662. WriteCH('PERSONFILE',' @ 'mFGRNPLACE)
  663.  
  664.                 WriteLn('PERSONFILE','')
  665.         jk = MARRIAGES - i
  666.         spcs = vert.jk'      |     '
  667. /*        ll = 2
  668.         IF i = 0 THEN ll = GetLength(FULLNAME) - Length(vert.j)
  669.         DO l = 0 TO ll
  670.             spcs = spcs' '
  671.         END                        */
  672. IF MARRIAGECELEBRANT ~= '' THEN WriteLn('PERSONFILE',spcs'Celebrant: 'MARRIAGECELEBRANT)
  673. IF MARRIAGECOMMENT ~= '' THEN WriteLn('PERSONFILE',spcs'  'MARRIAGECOMMENT)
  674. /*********************************************************************************/
  675.  
  676.     DO k = 0 TO 39            /*    ??? GETTOTCHILDREN FGRN ???    */            
  677.         'GETCHILD' mFGRN k
  678.         mFGRNc = RESULT
  679.         'GETFIRSTNAME' mFGRNc
  680.         mFGRNcFIRSTNAME = RESULT
  681. /**/
  682.         IF mFGRNcFIRSTNAME ~= "" THEN
  683.             DO
  684.             'GETLASTNAME' mFGRNc
  685.             mFGRNcLASTNAME = GetLastName(RESULT)
  686.             'GETFIRSTNAME' mFGRNc
  687.             mFGRNcFIRSTNAME = RESULT
  688.             thelastname = mFGRNcLASTNAME
  689. mFGRNcFULLNAME = GetFullName(mFGRNcFIRSTNAME)
  690.             'GETSEX' mFGRNc
  691. mFGRNcGENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  692.             'GETBIRTHDATE' mFGRNc
  693.             mFGRNcBIRTHDATE = RESULT
  694.             'GETDEATHDATE' mFGRNc
  695.             mFGRNcDEATHDATE = RESULT
  696. /**/
  697.             IF mFGRNcBIRTHDATE = "" THEN
  698. mFGRNcFILENAME = Space(substr(mFGRNcFIRSTNAME,1,2) substr(mFGRNcLASTNAME,1,6) mFGRNc)
  699.             ELSE
  700. mFGRNcFILENAME = Space(substr(mFGRNcFIRSTNAME,1,2) substr(mFGRNcLASTNAME,1,4) mFGRNcBIRTHDATE)
  701.  
  702.             jk = MARRIAGES - i
  703. WriteCH('PERSONFILE',vert.jk'      |_____ <A HREF="'mFGRNcFILENAME'.html">')
  704. /**/
  705.             IF mFGRNcLASTNAME ~= LASTNAME THEN
  706. WriteCH('PERSONFILE',' 'mFGRNcFULLNAME)
  707.             ELSE
  708. WriteCH('PERSONFILE',mFGRNcFIRSTNAME )
  709.  
  710. WriteCH('PERSONFILE','</A> ('mFGRNcGENDER') 'mFGRNcBIRTHDATE)
  711. /**/
  712.             IF mFGRNcDEATHDATE ~= "" THEN
  713. WriteCH('PERSONFILE','   + 'mFGRNcDEATHDATE)
  714.  
  715. Writeln('PERSONFILE','')
  716.             END
  717.         END
  718.     END
  719. /*********************************************************************************/
  720.                 END
  721.         END
  722.     ELSE DO
  723.         WriteLn('PERSONFILE','  |')
  724.         WriteLn('PERSONFILE','  <B>'FULLNAME'</B>')
  725.     END
  726.     WriteLn('PERSONFILE','</TT></PRE>')
  727. /*    WriteLn('PERSONFILE','<HR>')
  728.     WriteLn('PERSONFILE','<Address>')
  729.     WriteCh('PERSONFILE','<H3>ScionGenealogist © Robbie J Akins; ')
  730.     WriteLn('PERSONFILE','Scion3.06ToMosaic.rexx © Harold H. Ipolyi</H3>')
  731.     WriteLn('PERSONFILE','</Address>')                    */
  732.     WriteLn('PERSONFILE','</HTML>')
  733.     Close('PERSONFILE')
  734.     IF target = "NORMAL" & LASTNAME ~= "" THEN DO
  735.         WriteCH('GenealogyFile','<A HREF="'PERSONFILENAME'.html">')
  736.         IF GENDER = 'f' THEN WriteCH('GenealogyFile','<I>')
  737.             ELSE WriteCH('GenealogyFile','<B>')
  738.         WriteCH('GenealogyFile',FULLNAME)
  739.         IF GENDER = 'f' THEN WriteCH('GenealogyFile','</I>')
  740.             ELSE WriteCH('GenealogyFile','</B>')
  741.         WriteCH('GenealogyFile','</A>')
  742.         IF BIRTHDATE ~= "" THEN WriteCH('GenealogyFile',' ^ 'BIRTHDATE)
  743.         IF DEATHDATE ~= "" THEN WriteCH('GenealogyFile',' + 'DEATHDATE' ')
  744. /*********************************************************************************/
  745. IF HasFATHER THEN DO
  746.     WriteCH('GenealogyFile',' (()) ')
  747.     IF HasFileFATHER THEN WriteCH('GenealogyFile','<A HREF="'FATHERFILENAME'.html">')
  748.     WriteCH('GenealogyFile','<B>'FATHERFULLNAME'</B>')
  749.     IF HasFileFATHER THEN WriteCH('GenealogyFile','</A>')
  750.     IF HasMOTHER THEN DO
  751.         IF HasFATHER THEN WriteCH('GenealogyFile',' //\ ')
  752.         IF HasFileMOTHER THEN WriteCH('GenealogyFile','<A HREF="'MOTHERFILENAME'.html">')
  753.         WriteCH('GenealogyFile','<I>'MOTHERFULLNAME'</I>')
  754.         IF HasFileMOTHER THEN WriteCH('GenealogyFile','</A>')
  755.         END
  756.     END
  757. /*********************************************************************************/
  758.     WriteLn('GenealogyFile','<BR>')    /* do not close, we have many more to go. */
  759. END
  760.     RETURN
  761.  
  762.  
  763.  
  764.  
  765.  
  766. IsNumeric: PROCEDURE
  767.     PARSE ARG str
  768.     RETURN DataType(str, 'W')
  769.  
  770.  
  771.     /* create a file name short but unique */
  772.  
  773. FilName: PROCEDURE
  774.     PARSE ARG finm lanm bdate
  775.     RETURN Space(substr(finm,1,2) substr(lanm,1,4) bdate)
  776.  
  777. /******************************** Makedir **********************************/
  778.  
  779. /* Makedir - If a directory under the given name already exists, or can be
  780.    created, return 1, otherwise return 0. Though this function works
  781.    correctly under Workbench 1.3, it has the same effect as the existing
  782.    MAKEDIR; hence it is useful only under 2.0.
  783. */
  784. Makedir: procedure
  785.    ds = statef(arg(1))
  786.  
  787.    if ds='' then
  788.       result = 'MAKEDIR'(arg(1))
  789.    else
  790.       result = left(ds,3) = 'DIR'
  791.  
  792.    return result
  793.  
  794.  
  795. GetLength: PROCEDURE
  796.     PARSE UPPER ARG names
  797.     nonletters = length(compress(names, xrange('A','Z')))
  798.     RETURN Length(names) - nonletters * 4 / 10
  799.  
  800.     /* create a full name from first, last, and honorifics parts */
  801.  
  802. GetFullName: PROCEDURE EXPOSE thelastname
  803.     PARSE ARG firstnames "," hon
  804.     IF hon = "" THEN RETURN firstnames thelastname
  805.     RETURN firstnames Space(thelastname) || ","hon
  806.     
  807.  
  808.  
  809.     /* Capitalize last name; also handle special cases! */
  810.     /* End users must customize this code to aviod trashy output */
  811.  
  812. GetLastName: PROCEDURE
  813.     PARSE ARG str
  814.     IF str = "BAUER-GAUSS" THEN RETURN "Bauer-Gauss"
  815.         IF str = "DE IPOLYI" THEN RETURN "deIpolyi"
  816.         IF str = "MC GRADY" THEN RETURN "McGrady"
  817.     IF str = "V.BAUER" THEN RETURN "v.Bauer"
  818.         IF str = "KIS RED" THEN RETURN "KisRed"
  819.         IF str = "ROTH-HACKENSCHMIDT" THEN RETURN "Roth-Hackenschmidt"
  820.     ELSE
  821.         DO
  822.         spart = translate(substr(str,2,length(str)),xrange('a','z'),xrange('A','Z'))
  823.         END
  824.     RETURN substr(str,1,1)Space(spart)
  825.